/*
 * Copyright (c) 2011 Anthony Vandikas
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 
 * files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 
 * modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
 * is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include "stdafx.h"
#include "StudentVerifier.h"

#include "AbstractStudentList.h"
#include "AbstractHistory.h"

StudentVerifier::StudentVerifier(AbstractStudentList &studentList, AbstractHistory &history)
	: studentList(&studentList), history(&history)
{ }

std::tuple<bool, Student> StudentVerifier::verify(const QString &username, const QString &password, const Item &item) const
{
	// TODO: Cleanup, cleanup, everybody, everywhere!
	
	// Username
	if (!studentList->contains(username))
	{
		applicationInfo("Invalid username.");
		return std::make_tuple(false, Student());
	}

	auto student = (*studentList)[username];

	// Item
	foreach (auto entry, history->filter(QDate::currentDate(), QDate::currentDate(), QStringList(), QStringList()))
	{
		if (entry.getItem() != item)
			continue;

		applicationInfo("The item is already signed out.");
		return std::make_tuple(false, Student());
	}
	
	// Password
	if (student.getPassword() == QString::null)
	{
		bool ok;
		auto newPassword = QInputDialog::getText(
			QApplication::activeWindow(), 
			"InventoryMan", 
			"A password was not previously registered for '" + username + "'.\n"
			"Please re-confirm your password.",
			QLineEdit::Password,
			"",
			&ok);

		if (!ok)
			return std::make_tuple(false, Student());

		if (password != newPassword)
		{
			applicationInfo("The passwords did not match.");
			return std::make_tuple(false, Student());
		}

		studentList->setPassword(username, password);
	}
	else if (student.getPassword() != password)
	{
		applicationInfo("Invalid password.");
		return std::make_tuple(false, Student());
	}

	return std::make_tuple(true, student);
}
